home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / mig / migAlarm.c < prev    next >
C/C++ Source or Header  |  1990-03-12  |  3KB  |  152 lines

  1. /* 
  2.  * migAlarm.c --
  3.  *
  4.  *    Routines to manage the interval timer so that
  5.  *    operations to a remote host do not wait for recovery,
  6.  *    and so that the program that uses this library is generally
  7.  *    unaffected by the use of the interval timer.
  8.  *
  9.  * Copyright 1990 Regents of the University of California
  10.  * Permission to use, copy, modify, and distribute this
  11.  * software and its documentation for any purpose and without
  12.  * fee is hereby granted, provided that the above copyright
  13.  * notice appear in all copies.  The University of California
  14.  * makes no representations about the suitability of this
  15.  * software for any purpose.  It is provided "as is" without
  16.  * express or implied warranty.
  17.  */
  18.  
  19. #ifndef lint
  20. static char rcsid[] = "$Header: /sprite/lib/forms/RCS/proto.c,v 1.3 90/01/12 12:03:36 douglis Exp $ SPRITE (Berkeley)";
  21. #endif /* not lint */
  22.  
  23. #include <sprite.h>
  24. #include <stdio.h>
  25. #include <sys/signal.h>
  26. #include <sys/time.h>
  27. #include <errno.h>
  28. #include "migInt.h"
  29.  
  30.     
  31. static int (*oldHandler) ();
  32. static struct itimerval oldItimer;
  33. static int alarmSet = 0;
  34.  
  35. /*
  36.  * Set the default timeout, in seconds.
  37.  */
  38. #ifndef TIMEOUT
  39. #define TIMEOUT 10
  40. #endif /* TIMEOUT */
  41.  
  42.  
  43. /*
  44.  *----------------------------------------------------------------------
  45.  *
  46.  * AlarmHandler --
  47.  *
  48.  *    Routine to service a SIGALRM signal.  This routine disables
  49.  *    the alarm (letting the caller reenable it when appropriate).
  50.  *
  51.  * Results:
  52.  *    None.
  53.  *
  54.  * Side effects:
  55.  *    The alarm is disabled, and a warning message is printed.
  56.  *
  57.  *----------------------------------------------------------------------
  58.  */
  59. static int
  60. AlarmHandler()
  61. {
  62.     
  63.     alarm(0);
  64.     fprintf(stderr, "Warning: remote migd operation timed out.");
  65.     (void) signal (SIGALRM, SIG_IGN);
  66. }
  67.  
  68.  
  69. /*
  70.  *----------------------------------------------------------------------
  71.  *
  72.  * MigSetAlarm --
  73.  *
  74.  *    Set the interval timer, storing away any previous timer and signal
  75.  *    handler info.
  76.  *
  77.  * Results:
  78.  *    If any error is encountered, returns -1, else 0.
  79.  *
  80.  * Side effects:
  81.  *    Stores previous info in static variables.
  82.  *
  83.  *----------------------------------------------------------------------
  84.  */
  85.  
  86. int
  87. MigSetAlarm()
  88. {
  89.     int error;
  90.     struct itimerval itimer;
  91.  
  92.     if (alarmSet) {
  93.     printf("warning: mig alarm already set.\n");
  94.     } else {
  95.     alarmSet = 1;
  96.     }
  97.     itimer.it_interval.tv_sec = 0;
  98.     itimer.it_interval.tv_usec = 0;
  99.     itimer.it_value.tv_sec = TIMEOUT;
  100.     itimer.it_value.tv_usec = 0;
  101.  
  102.     oldHandler = (int (*)()) signal(SIGALRM, AlarmHandler);
  103.     if (oldHandler == (int (*)()) -1) {
  104.     fprintf(stderr, "Error setting signal handler.\n");
  105.     return(-1);
  106.     }
  107.     if (setitimer(ITIMER_REAL, &itimer, &oldItimer) == -1) {
  108.     error = errno;
  109.     (void) signal(SIGALRM, oldHandler);
  110.     errno = error;
  111.     return(-1);
  112.     }
  113.     return(0);
  114. }
  115.  
  116.  
  117. /*
  118.  *----------------------------------------------------------------------
  119.  *
  120.  * MigClearAlarm --
  121.  *
  122.  *    Restore the interval timer and SIGALRM handler.
  123.  *
  124.  * Results:
  125.  *    If any error is encountered, returns -1, else 0.
  126.  *
  127.  * Side effects:
  128.  *    None.
  129.  *
  130.  *----------------------------------------------------------------------
  131.  */
  132.  
  133. int
  134. MigClearAlarm()
  135. {
  136.     int error;
  137.     struct itimerval itimer;
  138.  
  139.     if (!alarmSet) {
  140.     fprintf(stderr, "warning: Mig alarm not set.\n");
  141.     return(-1);
  142.     } else {
  143.     alarmSet = 0;
  144.     }
  145.     if (setitimer(ITIMER_REAL, &oldItimer, (struct itimerval *) NULL) == -1) {
  146.     return(-1);
  147.     }
  148.     if (signal(SIGALRM, oldHandler) == (int (*)()) -1) {
  149.     return(-1);
  150.     }
  151. }
  152.